package org.lanyu.springainovel.novel.service;

import com.baomidou.mybatisplus.extension.service.IService;
import org.lanyu.springainovel.common.dto.StreamGenerationRequest;
import org.lanyu.springainovel.novel.entity.BookRole;
import reactor.core.publisher.Flux;

import java.util.List;
import java.util.Map;

/**
 * 人设服务接口
 */
public interface BookRoleService extends IService<BookRole> {

    /**
     * 根据书籍ID和版本获取人设
     * @param bookId
     * @param version
     * @return
     */
    BookRole getCharacterProfilesByBookIdAndVersion(Long bookId,Long version);


    /**
     * 根据书籍ID获取最新版本的人设
     * @param bookId
     * @return
     */
    BookRole getLatestCharacterProfile(Long bookId);
    
    /**
     * 获取当前启用状态的角色
     * @param bookId 书籍ID
     * @return 当前启用状态的角色，如果没有则返回null
     */
    BookRole getActiveCharacterProfile(Long bookId);
    
    /**
     * 添加人设
     *
     * @param bookRole 书籍人设实体，包含书籍ID和人设信息
     * @return 更新后的人设信息
     */
    BookRole addCharacterProfile(BookRole bookRole);

    /**
     * 删除指定书籍和版本的人设
     * @param bookId
     * @param version
     * @return
     */
    boolean deleteCharacterProfileByBookIdAndVersion(Long bookId,Long version);
    
    /**
     * 获取人设的所有历史版本
     * 
     * @param bookId 包含书籍ID
     * @return 人设历史版本列表
     */
    List<BookRole> getCharacterProfileVersions(Long bookId);
    
    /**
     * 获取书籍中所有派系及其人设数量
     * 
     * @param bookId 书籍ID
     * @return 派系及其人设数量
     */
    Map<String, Integer> getFactionStatistics(Long bookId);

    /**
     * 批量生成角色的流式接口
     * 
     * @param request 流式生成请求
     * @return 流式响应
     */
    Flux<String> batchGenerateCharacterProfilesStream(StreamGenerationRequest request);

    /**
     * 更新指定版本的人设
     *
     * @param bookRole 书籍人设实体，包含书籍ID、版本号和人设信息
     * @return 更新后的人设信息
     */
    BookRole updateCharacterProfileByVersion(BookRole bookRole);
    
    /**
     * 归档人设
     * 
     * @param bookRole 书籍人设实体，包含书籍ID和要归档的版本号
     * @return 归档后的人设信息
     */
    BookRole archiveCharacterProfile(BookRole bookRole);
}